\chapter{Systementwurf Missionsplaner}
\section{Geforderte Funktionen} \label{2.1} 
\subsection{Parklückensuche (Scout)}

Die wichtigste Mission ist der Scout-Modus, in dem der Roboter der Linie des Parcours folgt und nach Parklücken sucht. Die Verfolgung der Linie wird dabei vom Control-Modul, die Parklückensuche hauptsächlich im Navigations-Modul abgearbeitet. Wenn der Roboter Parklücken gefunden hat, in die er einparken kann, sollen diese auf dem Tablet angezeigt und für den User nutzbar werden.

\subsection{Gezieltes Einparken (Park This)}

Wählt der Nutzer eine Parklücke auf dem Tablet aus, wechselt der Roboter in den Park This-Modus. Hierbei fährt der Roboter auf dem Parcours zur geforderten Parklücke, und parkt dann über eine Trajektorienfahrt in diese ein. Dabei muss auf Kollisionen geachtet werden. Nach dem Einparken geht der Roboter in den Pause-Modus über, in dem er auf neue Befehle wartet. 

\subsection{Schnellstmöglich Einparken (Park Now)}
Wählt der User den Park Now-Modus, soll der Roboter in die nächste Parklücke einparken, die er findet. Dabei sucht er auf dem Parcours nach neuen Lücken, kann aber auch die Informationen über schon gefundene Lücken berücksichtigen.
\subsection{Ausparken (Leave Parkzone)}
Mit dem Leave Parkzone-Befehl verlässt der Roboter auf dem gleichen Weg die Parklücke, auf dem er sie erreicht hat. Auf dem Parcours geht er dann automatisch in den Scout-Modus über.
\subsection{Anhalten (Pause)}
Im Pause-Modus ruht der Roboter. Dieser Modus kann über das Display vom Nutzer jederzeit aktiviert werden.

\section{Hauptzustandsmaschine}

Die Hauptzustandsmaschine besteht hauptsächlich aus den geforderten Missionen, die vom Nutzer über das HMI gewählt werden können. Sie ist in Abbildung \ref{MFSM} dargestellt. Zustände der Hauptzustandsmaschine (Main FSM) werden dabei grau hinterlegt abgebildet. 

\begin{figure}[H]
\includegraphics[width=\textwidth]{Bilder/Haupt_FSM.png}
\caption{Hauptzustandsmaschine}
\label{MFSM}
\end{figure}

Das Programm startet im Pause-Modus und kann dann über Buttons auf dem Roboter oder über Befehle des HMI in andere Modi überführt werden. Die dicken Pfeile signalisieren dabei, dass von Pause aus in fast jeden der unteren Zustände gesprungen werden kann, indem die entsprechenden Buttons auf dem Display gedrückt werden. 

Ausnahmen bilden dabei die Zustände 'Pause in Parkzone' und 'Leave Parkzone'. Ersteres ist kein eigenständiger Zustand, sondern dient der besseren Visualisierung. Es ist der Pause-Modus, der erreicht wird, wenn der Roboter eingeparkt hat. Nur über den Befehl zum Scout-Modus wird die Hauptzustandsmaschine in den Leave Parkzone-Modus überführt und geht bei erfolgreichem Wiederfinden des Parcours automatisch in den Scout-Modus über.

Von jedem anderen Zustand kann der Pause-Modus durch Tastendruck aktiviert werden. Außerdem kann der Roboter durch Drücken der Escape-Taste jederzeit komplett ausgeschaltet werden. Da die Zustandsmaschine bei jedem Zyklus immer auch durch die Hauptzustandsmaschine läuft, ist in den Unterzustandsmaschinen kein Übergang zu Pause oder Exit von jedem einzelnen Zustand realisiert.

Die Zustände orientieren sich an den Beschreibungen in Kapitel \ref{2.1}.
Die Zustandsübergänge sind in Tabelle \ref{tab_MFSM} dargestellt. Hierbei wurde auf die Zustände mit Unterzustandsmaschinen verzichtet, weil sie diese als Eingangsaktion nur jeweils auf den Anfangszustand initialisieren und keine weiteren Aktionen durchführen. Die Abkürzung CM steht für ControlMode.

\begin{table}[H]
\centering
\caption{Zustandsübergänge Hauptzustandsmaschine}
\begin{tabular}{l|l|l|l}
Zustand & Eingangsaktion & Zustandsaktion & Ausgangsaktion\\
\toprule
Pause & CM = INACTIVE & & \\[1ex]
Exit & & hmi.disconnect() & \\
 & & System.exit(0)& \\
\end{tabular}
\label{tab_MFSM} 
\end{table}

\section{Unterzustandsmaschine Scout} \label{sec_S}

Die Unterzustandsmaschine (Sub FSM) Scout kann relativ einfach gehalten werden und besteht nur aus zwei Zuständen (siehe Abbildung \ref{SFSM}). 

\begin{figure}[H]
\centering
\includegraphics[width=0.6\textwidth]{Bilder/scout.png}
\caption{Sub FSM Scout}
\label{SFSM}
\end{figure}

In der Main FSM wird Scout aktiviert und initialisiert in der Sub FSM den Zustand Scout. Er umfasst die eigentliche Linienverfolgung und Parklückenerkennung. Somit wird hier der ControlMode Follow Line sowie die ParkingSlotDetection (PSD) und die NavigationCorrection (NC, Korrektur der Koordinaten durch die Navigation) aktiviert. In den Kurven vor den Parklücken (Kurven 1, 4 und 8) geht der Roboter kurzzeitig in den Drive Backwards Zustand, um 6 cm rückwärts zu fahren und so die Parklückenerkennung zu verbessern. Falls der Abstand hinten jedoch zu klein wird, d.h. die Bande schon zu nahe kommt, wird das Rückwärtsfahren abgebrochen.

Tabelle \ref{tab_SFSM} zeigt die Zustandsübergangstabelle.

\begin{table}[H]
\centering
\caption{Zustandsübergänge Sub FSM Scout}
\begin{tabular}{l|l|l|l}
Zustand & Eingangsaktion & Zustandsaktion & Ausgangsaktion\\
\toprule
Scout & CM = Follow Line & & \\
 & PSD = NC = true & & \\[1ex]
Drive Backwards & CM = v/w control & & \\
 & v = -75\%, w = 0\% & & \\
 & PSD = NC = false & & \\
\end{tabular}
\label{tab_SFSM} 
\end{table}

\section{Unterzustandsmaschine Park This}

Wenn der Nutzer eine bereits gefundene Parklücke auswählt, wechselt die Main FSM in Park This. Dort wird zunächst das Scouting zur Einparkposition aktiviert (siehe Abbildung \ref{PTFSM}).

\begin{figure}[H]
\centering
\includegraphics[width=\textwidth]{Bilder/park_this.png}
\caption{Sub FSM Park This}
\label{PTFSM}
\end{figure}

Wenn die Position erreicht ist, wird der Einparkvorgang über die Trajektorienfahrt aktiviert. Hierbei wird immer die Distanz hinter dem Roboter überprüft, um nicht gegen ein Hindernis zu fahren. Falls der Abstand kleiner als 2 cm wird, geht der Roboter in einen Fehlermodus, in dem er deaktiviert wird und nur durch einen kompletten Neustart reaktiviert werden kann (im Normalfall darf kein Hindernis auftreten).

Ist das Ende des Pfades erreicht, wird entschieden, ob die Ausrichtung positiv oder negativ korrigiert werden soll. Je nach der Entscheidung geht der Roboter in einen Korrekturstatus über, indem der Winkel durch eine Vorwärtsfahrt angepasst wird. Hierbei wird der benötigte Weg aufsummiert. Ist der richtige Winkel erreicht, wird der benötigte Weg zur Korrektur wieder rückwärts gefahren, um die Zielpose zu erreichen. Danach geht der Roboter in den 'Pause in Parkzone'-Status und wartet auf den Befehl zum Ausparken.

In Tabelle \ref{tab_PTFSM} ist die Zustandsübergangstabelle dargestellt.

\begin{table}[H]
\centering
\caption{Zustandsübergänge Sub FSM Park This}
\begin{tabular}{l|l|l|l}
Zustand & Eingangsaktion & Zustandsaktion & Ausgangsaktion\\
\toprule
Scout to & CM = Follow Line & & Pos. reached = true\\
Parking Slot & PSD = false & & \\
 & NC = true & & \\[1ex]
Park & CM = Follow Path & & \\
 & Koeff. übergeben & & \\
  & NC = false & & \\[1ex]
Error & CM = INACTIVE & Fehler auf Display & \\[1ex]
Adjust + & CM = v/w control & S+ summieren & S+ speicheren\\
 & v = 50\%, w = 50\% & & \\[1ex]
Adjust - & CM = v/w control & S+ summieren & S+ speichern\\
 & v = 50\%, w = -50\% & & \\[1ex]
Backwards & CM = v/w control & S- summieren & \\
 & v = -50\%, w = 0\% & & \\
\end{tabular}
\label{tab_PTFSM} 
\end{table}

\section{Unterzustandsmaschine Park Now}

Da sich der Park Now Modus nur durch die Parklückenauswahl von Park This unterscheidet, kann ein Großteil von diesem Modus mitgenutzt werden und muss nicht doppelt programmiert werden. Aus diesem Grund kann die Sub FSM Park Now recht einfach gehalten werden (siehe Abbildung \ref{PNFSM})

\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{Bilder/park_now.png}
\caption{Sub FSM Park Now}
\label{PNFSM}
\end{figure}

Bei Start dieser Mission geht der Roboter in einen Scout Modus über, in dem er alle bekannten Parklücken auf ihre Entfernung überprüft und immer nach neuen Lücken sucht. Sobald er eine Parkposition erreicht hat, fängt er mit dem Parkvorgang an, indem der Zustand Park This mit Unterzustand Park angesprungen wird. Dies kann auch geschehen, indem er einen gerade entdeckten Parkplatz sofort anfährt. Tabelle \ref{tab_PNFSM} zeigt die entsprechende Zustandsübergangstabelle.

\begin{table}[H]
\centering
\caption{Zustandsübergänge Sub FSM Park Now}
\begin{tabular}{l|l|l|l}
Zustand & Eingangsaktion & Zustandsaktion & Ausgangsaktion\\
\toprule
Scout for next & CM = Follow Line & & Pos. reached = true\\
Parking Slot & PSD = NC = true & & \\[1ex]
Park & CM = Follow Path & & \\
 & Koeff. übergeben & & \\
 & PSD = NC = false & & \\

\end{tabular}
\label{tab_PNFSM} 
\end{table}

\section{Unterzustandsmaschine Leave Parkzone} \label{sec_LP}

Die Mission Leave Parkzone kann nur aktiviert werden, wenn der Roboter in der Parklücke steht und auf neue Befehle wartet. Die Sub FSM ist in Abbildung \ref{LPFSM} dargestellt. Wird die Mission aktiviert, geht die Sub FSM in den gleichnamigen Unterzustand über und fährt auf dem gleichen Weg aus der Parklücke, auf dem der Roboter diese erreicht hat. Die Trajektorie wird dennoch neu berechnet, weil die Richtung eine andere ist und somit neue Koeffizienten nötig werden.

\begin{figure}[H]
\centering
\includegraphics[width=\textwidth]{Bilder/leave_park.png}
\caption{Sub FSM Leave Parkzone}
\label{LPFSM}
\end{figure}

Auch hier wird immer überprüft, ob etwas den Weg blockiert. In diesem Fall wird wieder in einen Fehlerzustand übergegangen. Ist das Ende des Pfades erreicht, wird die Postion anhand der Navigationsdaten und der Liniensensoren überprüft. Zeigt mindestens ein Liniensensor nicht Weiß an, kann sofort in den Scout-Modus übergegangen werden. Andernfalls ist eine Korrektur bzw. Liniensuche nötig.

In diesem Fall wird zunächst stark nach links gefahren. Wird die Linie nach 2 Sekunden nicht gefunden, wird davon ausgegangen, dass sie nicht mehr kommen wird und der Zustand wird in 'Drive Right' geändert. 

In diesem Zustand verbleibt der Roboter, bis die Linie gefunden wurde. Dann beginnt er normal mit dem Scout-Modus. In Tabelle \ref{tab_LPFSM} ist die Zustandsübergangstabelle dargestellt.

\begin{table}[H]
\centering
\caption{Zustandsübergänge Sub FSM Leave Parkzone}
\begin{tabular}{l|l|l|l}
Zustand & Eingangsaktion & Zustandsaktion & Ausgangsaktion\\
\toprule
Leave & CM = Follow Path & & Pos. reached = true\\
Parkzone & Koeff. übergeben & & \\
 & PSD = NC = false & & \\[1ex]
Error & CM = INACTIVE & Fehler auf Display & \\[1ex]
Drive & CM = v/w control & & \\
Left & v = 0\%, w = 50\% & & \\[1ex]
Drive & CM = v/w control & & \\
Right & v = 0\%, w = -50\% & & \\[1ex]

\end{tabular}
\label{tab_LPFSM} 
\end{table}